啟動一個基本可用的MongoDB服務相對簡單,只要使用MongoDB官方提供的Image,設定對應的連接阜(Port)、使用者(User)、以及要存放資料的位置(如果想要保存在Host主機上的話)即可。
以下以專案名稱:nextpage
為例:
我們使用 MongoDB 6.0.4 的官方 image 來建立一個 service:
version: "2"
services:
mongodb:
image: mongo:6.0.4
container_name: mongodb
restart: unless-stopped
volumes:
- MONGO_VOLUMES:/data/db
ports:
- 27017:27017
volumes:
MONGO_VOLUMES:
MONGO_VOLUMES
的volume來保存Mongodb的資料。
圖: Inbound Rule: TCP 27017
這樣就啟動了一個可連線的MongoDB。
但除了基本的連線環境外,對於專案的使用來說,還需要進一步的設定,主要包含以下兩個方面:
下面進一步介紹如何進行這些設定:
這部分會對MongoDB服務做以下設定:
authentication enabled
模式啟動,驗證User在Database的操作。nextpage
,並新增一個具備Read / Rrite
這個Database權限的User。整個檔案結構如下:
├── docker-compose.yml
├── mongodb
│ └── initdb.d
│ └── nextpage.js
docker-entrypoint-initdb.d
目錄下存在script檔案,在啟動MongoDB時,會自動use MONGO_INITDB_DATABASE指定的資料庫,並執行scrip內的指令。下面說明把Script 掛載進Container的方式:
docker-entrypoint-initdb.d
這個接口,來讓容器啟動時執行一些初始化script。以我們專案使用的例子來說,可在docker-compose如下設定:
…
volumes:
- ./mongodb/initdb.d/:/docker-entrypoint-initdb.d/
…
/mongodb/initdb.d
mount 到 容器的路徑:/docker-entrypoint-initdb.d
。這樣在容器啟動執行MongoDB時,就會自動執行被mount進去/docker-entrypoint-initdb.d下面的nextpage.js。version: "2"
services:
mongodb:
image: mongo:6.0.4
container_name: mongodb
restart: unless-stopped
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root
- MONGO_INITDB_DATABASE=nextpage
volumes:
- ./mongodb/initdb.d/:/docker-entrypoint-initdb.d/
- MONGO_VOLUMES:/data/db
ports:
- 27017:27017
volumes:
MONGO_VOLUMES:
其中:
docker-entrypoint-initdb.d/
的路徑。nextpage
authentication enabled
的模式啟動 (等同於使用指令: mongod — auth
),也就是所有操作都會驗證User的權限
。Authentication Database
會是admin
這個Database。所以如果要用這個root登入,連線的connection string必須指定authSource
為admin
例如:
mongodb://root:root@Server的URL:27017/nextpage?serverSelectionTimeoutMS=5000&connectTimeoutMS=10000&authSource=admin&authMechanism=SCRAM-SHA-256
Authentication Database
。Authentication Database + User
當作User權限驗證的唯一識別
,並且存在admin
這個database的collection: system.users
。admin
及 Authentication Database的關聯system.users
裡面。Authentication Database
。mongodb/initdb.d/nextpage.js
中:
action_record
和 food_record
這兩個 Collection,來存放我們專案要紀錄的使用者訓練及飲食紀錄。developer
下面是mongodb/initdb.d/nextpage.js
的內容
db.createCollection("action_record");
db.createCollection("food_record");
// 已經在MONGO_INITDB_DATABASE指定過資料庫名稱,所以預設就是使用`nextpage`這個Database,
// 不用加上use nextpage
db.createUser({
user: "developer",
// 在mongo shell 操作時可以用passwordPrompt, 輸入完指令後自己打密碼進去
// 這邊因為是給測試用docker自動執行的指令,所以直接指定密碼 (cleartext password)
pwd: "1qaz2wsx..",
// 任何額外資訊
customData: { name: "Henry" },
roles: [
// 針對當前db(nextpage)的role可以直接用字串指定role name
"readWrite",
// 針對其他db的role需要用 object: {role: "role name", db: "db name"}
// Note: db: "" 代表for 所有database
{ role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
]
},)
.js
或 .sh
的腳本檔案。可用的資源
,以及可對資源做的操作
:MongoDB的Role又分成Built-in
及自訂Role
,及其他種類:
1.Built-in Role
Database administration
Role 及 一般(非admin)database
的Built-in role2.Admin相關 Role:只針對admin這個database的Role。
3.其他:
本篇文章說明如何以Docker啟動一個MongoDB服務:
/docker-entrypoint-initdb.d/
,目的是將我們寫的script掛載到Container,讓他啟動時自動執行初始設定。至此,我們在EC2上執行的基礎設施: Kafka, MongoDB,以及我們開發的BotServer程式都已經設置完成。
下一篇將說明OpenAI的基礎觀念,以及API的實作。
本文修改自作者的blog文章: [Mongo] 如何使用Docker Compose設置一個包含初始資料庫和使用者驗證的MongoDB Service